package com.ruoyi.system.domain;

import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;

/**
 * 操作日志实体类（对应 t_operation_log 表）
 */
@Data
@TableName("t_operation_log")
@ApiModel(description = "操作日志实体，记录系统中各类操作行为的详细信息（如操作人、业务类型、操作动作等）")
public class OperationLog {

    /**
     * 主键ID（自增）
     */
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(
            value = "日志记录主键ID（自增，前端无需传递）",
            required = false,
            example = "1001"
    )
    private Long id;

    /**
     * 操作人ID（关联用户表主键）
     */
    @ApiModelProperty(
            value = "操作人ID（关联系统用户表主键，必选）",
            required = true,
            example = "10086"
    )
    private Long operateUserId;

    /**
     * 操作人姓名（冗余存储）
     */
    @ApiModelProperty(
            value = "操作人姓名（建议从登录用户信息中获取，前端可不传）",
            required = false,
            example = "张三"
    )
    private String operateUserName;

    /**
     * 操作时间（默认当前时间）
     */
    @ApiModelProperty(
            value = "操作时间（不传则系统自动填充当前时间，格式：yyyy-MM-dd HH:mm:ss）",
            required = false,
            example = "2024-09-27 15:30:00"
    )
    private LocalDateTime operateTime;

    /**
     * 业务类型（DESIGN=图纸设计、ORDER=订单、USER=用户、CONFIG=系统配置）
     */
    @ApiModelProperty(
            value = "业务类型（必选，枚举值：DESIGN=图纸设计、ORDER=订单、USER=用户、CONFIG=系统配置）",
            required = true,
            allowableValues = "DESIGN, ORDER, USER, CONFIG",
            example = "DESIGN"
    )
    private String businessType;

    /**
     * 业务关联ID（如图纸ID、订单ID）
     */
    @ApiModelProperty(
            value = "业务关联ID（必选，如图纸ID=3FO3461K81DC、订单ID=OD20240927001）",
            required = true,
            example = "3FO3461K81DC"
    )
    private String businessId;

    /**
     * 业务名称（如图纸名称、订单编号）
     */
    @ApiModelProperty(
            value = "业务名称（可选，如图纸名称=客厅设计图、订单编号=OD20240927001）",
            required = false,
            example = "客厅设计图"
    )
    private String businessName;

    /**
     * 操作动作（STATUS_CHANGE=状态变更、FILE_UPLOAD=文件上传、FILE_DELETE=文件删除等）
     */
    @ApiModelProperty(
            value = "操作动作（必选，枚举值：STATUS_CHANGE=状态变更、FILE_UPLOAD=文件上传、FILE_DELETE=文件删除、DATA_ADD=数据新增、DATA_EDIT=数据编辑、DATA_DELETE=数据删除）",
            required = true,
            allowableValues = "STATUS_CHANGE, FILE_UPLOAD, FILE_DELETE, DATA_ADD, DATA_EDIT, DATA_DELETE",
            example = "FILE_UPLOAD"
    )
    private String operateAction;

    /**
     * 操作前状态（非状态变更场景可空）
     */
    @ApiModelProperty(
            value = "操作前状态（仅operateAction=STATUS_CHANGE时必填，如：DRAFT=草稿、PUBLISHED=已发布）",
            required = false,
            example = "DRAFT"
    )
    private String beforeStatus;

    /**
     * 操作后状态（非状态变更场景可空）
     */
    @ApiModelProperty(
            value = "操作后状态（仅operateAction=STATUS_CHANGE时必填，如：PUBLISHED=已发布、ARCHIVED=已归档）",
            required = false,
            example = "PUBLISHED"
    )
    private String afterStatus;

    /**
     * 是否同步H5设计动态（0=否，1=是）
     */
    @ApiModelProperty(
            value = "是否同步H5设计动态（可选，0=否，1=是，默认0）",
            required = false,
            allowableValues = "0, 1",
            example = "0"
    )
    private Integer isSyncH5Design;

    /**
     * 操作备注
     */
    @ApiModelProperty(
            value = "操作备注（可选，记录详细操作说明，如：上传客厅设计图初稿）",
            required = false,
            example = "上传客厅设计图初稿"
    )
    private String remark;

    /**
     * 操作来源（PC_WEB=PC网页端、APP=移动端APP、H5=H5页面、SYSTEM=系统自动操作）
     */
    @ApiModelProperty(
            value = "操作来源（必选，枚举值：PC_WEB=PC网页端、APP=移动端APP、H5=H5页面、SYSTEM=系统自动操作）",
            required = true,
            allowableValues = "PC_WEB, APP, H5, SYSTEM",
            example = "PC_WEB"
    )
    private String operateSource;

    /**
     * 逻辑删除标识（0=未删除，1=已删除）
     * 注：MyBatis-Plus 全局配置已指定逻辑删除字段，无需额外处理
     */
    @TableLogic
    @ApiModelProperty(
            value = "逻辑删除标识（前端无需传递，0=未删除，1=已删除）",
            required = false,
            example = "0",
            hidden = true // 隐藏，前端无需关注
    )
    private Integer isDeleted;



    /**
     * 操作来源枚举
     */
    public static class Source {
        public static final String PC_WEB = "PC_WEB"; // PC网页端
        public static final String APP = "APP";       // 移动端APP
        public static final String H5 = "H5";         // H5页面
        public static final String SYSTEM = "SYSTEM"; // 系统自动操作
    }
}